import constant
from uuid import uuid1
from flask import jsonify
import pymysql
from DBUtils.PooledDB import PooledDB, SharedDBConnection


# 生成短UUID
def short_uuid():
    uuid = str(uuid1()).replace('-', '')
    short_id = ''
    for i in range(0, constant.UUID_LEN):
        sub = uuid[i * 4: i * 4 + 4]
        x = int(sub, 16)
        short_id += constant.UUID_CHARS[x % 0x3E]
    return short_id


# 文件名生成器
def get_img_name(is_new=True, img_path=None, file_name=None):
    if is_new:
        filename = short_uuid() + "." + file_name.split('.')[1]
    else:
        if img_path is not None:
            print(img_path.split('.'))
            name_len = constant.UUID_LEN + len("." + img_path.split('.')[1])
            path_len = len(img_path)
            filename = img_path[path_len - name_len: path_len]
        elif file_name is not None:
            filename = file_name.split('.')[0]
    return filename


# 数据返回工具类
class result_util:
    def __init__(self):
        self.result = {"code": 0, "msg": '', "data": ''}

    def ok(self, msg="操作成功！", data=None):
        self.set_attr(0, msg, data)
        return jsonify(self.result)

    def error(self, msg="操作失败！", data=None):
        self.set_attr(-1, msg, data)
        return jsonify(self.result)

    def set_attr(self, code, msg, data):
        self.result["code"] = code
        self.result["msg"] = msg
        self.result["data"] = data


# 数据库工具类
class mysql_PooledDB(object):
    # 初始化设置
    def __init__(self):
        # 创建连接
        self.pool_db = PooledDB(
            # 指定数据库连接驱动
            creator=pymysql,
            # 连接池允许的最大连接数,0和None表示没有限制
            maxconnections=3,
            # 初始化时,连接池至少创建的空闲连接,0表示不创建
            mincached=2,
            # 连接池中空闲的最多连接数,0和None表示没有限制
            maxcached=5,
            # 连接池中最多共享的连接数量,0和None表示全部共享(其实没什么卵用)
            maxshared=3,
            # 连接池中如果没有可用共享连接后,是否阻塞等待,True表示等等,
            # False表示不等待然后报错
            blocking=True,
            # 开始会话前执行的命令列表
            setsession=[],
            # ping Mysql服务器检查服务是否可用
            ping=0,
            **constant.DB_CONFIG
        )
        # 构造函数，创建数据库连接、游标
        self.coon = self.pool_db.connection()
        self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)

    # 插入
    def insert(self, sql, data):
        """
        @summary: 执行插入
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @return: count 影响的条目数量
        @param data:
        """
        count = self.cur.execute(sql, data)
        # 提交
        self.coon.commit()
        return count

    # 删除
    def delete(self, sql):
        """
        @summary: 执行删除
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @return: count 影响的条目数量
        """
        count = self.cur.execute(sql)
        # 提交
        self.coon.commit()
        return count

    # 更新
    def update(self, sql):
        """
        @summary: 执行更新
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @return: count 影响的条目数量
        """
        count = self.cur.execute(sql)
        # 提交
        self.coon.commit()
        return count

    # 查询
    def select(self, sql, param=None):
        """
        @summary: 执行查询
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @param param: 可选参数，条件列表值（元组/列表）
        @return: result list/boolean 查询到的结果集
        """
        if param is None:
            self.cur.execute(sql)
        else:
            self.cur.execute(sql, param)
        return self.cur.fetchmany()

    # 释放资源
    def dispose(self):
        self.coon.close()
        self.cur.close()

